package com.tongsys.server.utils;

import com.fasterxml.jackson.databind.util.BeanUtil;
import com.tongsys.server.entity.Meta;
import com.tongsys.server.entity.Permission;
import com.tongsys.server.entity.User;
import com.tongsys.server.vo.RouterVo;
import io.netty.util.internal.ObjectPool;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Api("生成菜单树的工具类")

public class MenuUtils {


    @ApiOperation("生成路由，返回的是 vue-elememt-admin 中的路由格式")
    public static List<RouterVo> makeRouter(List<Permission> menuList, Integer pid){
        //创建集合 保存路由列表
        List<RouterVo> routerList = new ArrayList<>();
        //如果menuList 菜单列表不为空，则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream()
                .filter(item->item!=null && pid.equals(item.getParentId())) //过滤不为空的，pid为pid的菜单
                .forEach(item->{
                    //创建路由对象
                    RouterVo routerVo = new RouterVo();
                    //设置路由名称
                    routerVo.setName(item.getName());
                    //设置路由路径
                    routerVo.setPath(item.getUrl());
                    //判断是否是一级菜单
                    if(item.getParentId()==0){
                        //一级菜单组件
                        routerVo.setComponent("Layout");
                        //显示路由
                        routerVo.setAlwaysShow(true);
                    }else {
                        //具体的组件
                        routerVo.setComponent(item.getUrl());
                        //折叠路由
                        routerVo.setAlwaysShow(false);
                    }
                    //设置路由元信息
                    routerVo.setMeta(new Meta(item.getLabel(),item.getIcon(),item.getCode().split(",")));

                    //递归生成子路由
                    List<RouterVo> child = MenuUtils.makeRouter(menuList, item.getId());
                    routerVo.setChildren(child);
                    routerList.add(routerVo);
                });
        //返回路由列表
        return routerList;
    }

    @ApiOperation("生成菜单")
    public static List<Permission> makeMenu(List<Permission> menuList, Integer pid){
        //创建集合 保存对象
        List<Permission> permissionList = new ArrayList<>();

        //判断菜单列表是否为空，如果为空，则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())//如果为空 返回一个空的list集合
                .stream() //stream流
                .filter(item->item!=null && pid.equals(item.getParentId()))  //不为空的时候执行
                .forEach(item->{
                    //循环对象
                    //创建菜单对象
                    Permission permission = new Permission();
                    BeanUtils.copyProperties(item,permission);//将item对象复制到permission对象

                    //递归  获取每个item下面的子菜单列表
                    List<Permission> child = MenuUtils.makeMenu(menuList, item.getId());
                    permission.setChildren(child);
                    permissionList.add(permission);
                });
        //返回菜单集合
        return permissionList;
    }



}
